/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.scp.controlador;

import java.io.Serializable;
import java.math.BigDecimal;
import java.math.MathContext;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.faces.event.ActionEvent;
import javax.inject.Inject;
import javax.inject.Named;
import org.springframework.context.annotation.Scope;
import pe.com.cotelasa.common.controlador.MBGenerico;
import pe.com.cotelasa.scp.common.IObserver;
import org.apache.log4j.Logger;
import org.primefaces.event.DateSelectEvent;
import org.springframework.beans.factory.annotation.Autowired;
import static pe.com.cotelasa.common.controlador.MBGenerico.mostrarError;
import static pe.com.cotelasa.common.controlador.MBGenerico.mostrarMensaje;

import pe.com.cotelasa.scp.controlador.backingBean.BKCompraFacturacion;
import pe.com.cotelasa.scp.controlador.comando.ComandoGuardar;
import pe.com.cotelasa.scp.dominio.common.COLOR_ESTADO_VENTA;
import pe.com.cotelasa.scp.dominio.common.Constantes;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.common.TIPO_DOC_COMPRA;
import pe.com.cotelasa.scp.dominio.common.TIPO_MONEDA;
import pe.com.cotelasa.scp.dominio.common.URLPaginacion;
import pe.com.cotelasa.scp.dominio.common.util.UtilitarioCadenas;
import pe.com.cotelasa.scp.dominio.common.util.UtilitarioFecha;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioCompraFacturacion;
import pe.com.cotelasa.scp.dominio.service.IServicioDetalleOrdenCompraServicio;
import pe.com.cotelasa.scp.dominio.service.IServicioGuiaRemision;
import pe.com.cotelasa.scp.dominio.service.IServicioOrdenCompraServicio;
import pe.com.cotelasa.scp.dominio.service.IServicioParametro;
import pe.com.cotelasa.scp.dominio.service.IServicioTipoCambio;
import pe.com.cotelasa.scp.dominio.service.IServicioTipoFormaPago;
import pe.com.cotelasa.scp.entidad.CompraFacturacion;
import pe.com.cotelasa.scp.entidad.DetalleCompraFacturacion;
import pe.com.cotelasa.scp.entidad.DetalleGuiaRemision;
import pe.com.cotelasa.scp.entidad.DetalleOrdenCompraServicio;
import pe.com.cotelasa.scp.entidad.GuiaRemision;
import pe.com.cotelasa.scp.entidad.OrdenCompraServicio;
import pe.com.cotelasa.scp.entidad.OrdenPedido;
import pe.com.cotelasa.scp.entidad.ParametroDetalle;
import pe.com.cotelasa.scp.entidad.Proveedor;
import pe.com.cotelasa.scp.entidad.TipoCambio;
import pe.com.cotelasa.scp.entidad.TipoFormaPago;
import pe.com.cotelasa.scp.entidad.TipoMoneda;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;

/**
 *
 * @author WINDOWS 7
 */
@Named(value = "MBCompraFacturaImportacion")
@Scope("request")
public class MBCompraFacturaImportacion extends MBGenerico implements IMantenedor, IObserver, Serializable {

    private static final long serialVersionUID = -8665913600449084832L;
    private static Logger logger = Logger.getLogger(MBCompraFacturaImportacion.class);
    @Inject
    private BKCompraFacturacion bk;
    @Inject
    private IServicioCompraFacturacion servicioCompraFacturacion;
    @Inject
    private IServicioTipoCambio servicioTipoCambio;
    @Inject
    private IServicioTipoFormaPago servicioFormaPago;
    @Inject
    private IServicioGuiaRemision servicioGR;
    @Inject
    private IServicioOrdenCompraServicio servicioOrdenCS;
    @Inject
    private IServicioParametro servicioParametro;
    @Inject
    private IServicioDetalleOrdenCompraServicio servicioDetalleOCS;
    @Autowired
    BKSession session;

    public void buscarListaFacturas() {
        try {
            if (bk.getFacturaBusqueda().getIdOrdenPedido() == null) {
                bk.getFacturaBusqueda().setIdOrdenPedido(new OrdenPedido());
            }
            bk.getFacturaBusqueda().setIdEmpresa(session.getEmpresa());
            bk.getFacturaBusqueda().getIdOrdenPedido().setIdEmpresa(session.getEmpresa());
            bk.setListaFacturasBusqueda(servicioCompraFacturacion.buscarCompraFacturacionPorFiltro(bk.getFacturaBusqueda(), bk.getFechaInicio(), bk.getFechaFinal()));
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al cargar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }

    public String mostrar() {

        bk.setFacturaBusqueda(new CompraFacturacion());
        bk.getFacturaBusqueda().setNumeroFactura("");;
        bk.getFacturaBusqueda().setTipoCompPago(TIPO_DOC_COMPRA.FACTURA_IMPORTACION.getValor());
        bk.getFacturaBusqueda().setIdOrdenPedido(new OrdenPedido(-1));
        bk.getFacturaBusqueda().setIdOrdenCompraServicio(new OrdenCompraServicio(-1));
        bk.setListaFacturasBusqueda(null);
        bk.getFacturaBusqueda().setEstadoCancelacion('0');
        bk.getFacturaBusqueda().setIdProveedor(new Proveedor());
        bk.getFacturaBusqueda().getIdProveedor().setRazonSocial("");


        return URLPaginacion.FacturaImportacion.URL_LISTA_COMPRA_FACTURA_IMPORTACION;
    }

    @Override
    public String nuevo() {
        this.bk.setComando(new ComandoGuardar(this));

        bk.setFacturaFormulario(new CompraFacturacion());
        bk.getFacturaFormulario().setIdEmpresa(session.getEmpresa());
        bk.getFacturaFormulario().setIdProveedor(new Proveedor());
        bk.getFacturaFormulario().setIdTipoMoneda(new TipoMoneda(TIPO_MONEDA.DOLARES.getValor()));
        bk.getFacturaFormulario().setTipoCompPago(TIPO_DOC_COMPRA.FACTURA_IMPORTACION.getValor());
        bk.getFacturaFormulario().setFormaPago(new TipoFormaPago());
        bk.getFacturaFormulario().setIdOrdenCompraServicio(new OrdenCompraServicio(0));
        bk.getFacturaFormulario().setIdOrdenPedido(new OrdenPedido(0));
        bk.getFacturaFormulario().setValorCFR(BigDecimal.ZERO);
        bk.getFacturaFormulario().setValorCIF(BigDecimal.ZERO);
        bk.getListaGuiaSeleccionadas().clear();
        bk.getListaGuiaRemisionElegido().clear();
        bk.getListaGuiaRemisionElegir().clear();

        bk.setListaDetalleFactura(new ArrayList<DetalleCompraFacturacion>());
        try {
            bk.setListaFormaPago(servicioFormaPago.obtenerTipoFormaPagoActivos());
        } catch (ServiceException e) {
            logger.error(e.getMessage(), e);
            mostrarError("Ocurrio un error al cargar la informacion.");
        }
        listarOrdenCS();
        return URLPaginacion.FacturaImportacion.URL_FORMULARIO_COMPRA_FACTURA_IMPORTACION;
    }

    @Override
    public String guardar() {
        try {
            bk.getFacturaFormulario().setFecCreacion(new Date());
            bk.getFacturaFormulario().setUsrCreacion(session.getUsuario().getUsuario());
            bk.getFacturaFormulario().setTipoFactura(bk.getFacturaFormulario().getIdOrdenCompraServicio().getTipo());
            bk.getFacturaFormulario().setEstadoCancelacion(COLOR_ESTADO_VENTA.EMITIDO.getEstado());
            bk.getFacturaFormulario().setDetalleFacturaCollection(bk.getListaDetalleFactura());

            //bk.getFacturaFormulario().setNumeroFactura(UtilitarioCadenas.formatoNumeroDocumento(Integer.parseInt(bk.getFacturaFormulario().getNumeroFactura())));

            bk.getFacturaFormulario().setFormaPago(
                    servicioFormaPago.conseguirTipoFormaPagoPorNombre(bk.getFacturaFormulario().getFormaPago().getNombre()));

            servicioCompraFacturacion.guardarCompraFacturacion(bk.getFacturaFormulario());
            for (GuiaRemision guia : bk.getListaGuiaRemisionElegido()) {
                guia.setIdFactura(bk.getFacturaFormulario());
                servicioGR.actualizarGuiaDeRemision(guia);

            }
            buscarListaFacturas();
            mostrarMensaje("Se guardo la factura satisfactoriamente.");
        } catch (ServiceException e) {
            e.printStackTrace();
            mostrarError("Ocurrieron algunos problemas al guardar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
        return URLPaginacion.FacturaImportacion.URL_LISTA_COMPRA_FACTURA_IMPORTACION;
    }

    @Override
    public String editar() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public String actualizar() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public String ver() {
        try {
            bk.setFacturaFormulario(servicioCompraFacturacion.conseguirCompraFacturacionPorId(bk.getFacturaFormulario().getId()));
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al eliminar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
        return URLPaginacion.FacturaImportacion.URL_VER_COMPRA_FACTURA_IMPORTACION;
    }

    @Override
    public void eliminar(ActionEvent actionEvent) {
        try {
            bk.setFacturaSeleccionada(servicioCompraFacturacion.conseguirCompraFacturacionPorId(bk.getFacturaSeleccionada().getId()));
            bk.getFacturaSeleccionada().setEstadoRegistro(ESTADO_REGISTRO.INACTIVO.getValor());
            bk.getFacturaSeleccionada().setUsrModificacion(session.getUsuario().getUsuario());
            bk.getFacturaSeleccionada().setFecModificacion(new Date());
            //servicioCompraFacturacion.actualizarCompraFacturacion(bk.getFacturaSeleccionada());
            for (GuiaRemision guia : bk.getFacturaSeleccionada().getGuiaRemisionCollection()) {
                guia.setIdFactura(null);
            }

            buscarListaFacturas();
            mostrarMensaje("Se elimino la Orden de Compra satisfactoriamente");
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al eliminar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }

    public void listarOrdenCS() {
        try {

            OrdenCompraServicio orden = new OrdenCompraServicio();
            orden.setIdOrdenPedido(new OrdenPedido(0));
            orden.setTipo('C');
            String[] listaEsdado = {"" + OrdenCompraServicio.ESTADO_ORDEN_SC.ANULADO.getValor(),
                "" + OrdenCompraServicio.ESTADO_ORDEN_SC.BORRADOR.getValor()};

            bk.setListaOrdenesCSFormulario(servicioOrdenCS.listarOrdenCSConCodigoPorOP(orden, listaEsdado));
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al guardar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }


    }

    public void obtenerListaGuias() {
        GuiaRemision guia = new GuiaRemision();
        bk.getListaDetalleFactura().clear();
        try {
            if (bk.getFacturaFormulario().getIdOrdenCompraServicio().getId() != 0) {

                bk.getFacturaFormulario().setIdOrdenCompraServicio(servicioOrdenCS.conseguirOrdenCompraServicioPorId(bk.getFacturaFormulario().getIdOrdenCompraServicio().getId()));

                bk.getFacturaFormulario().setIdProveedor(bk.getFacturaFormulario().getIdOrdenCompraServicio().getIdProveedor());
                bk.getFacturaFormulario().setIdTipoMoneda(bk.getFacturaFormulario().getIdOrdenCompraServicio().getIdTipoMoneda());

                bk.getFacturaFormulario().setFormaPago(bk.getFacturaFormulario().getIdOrdenCompraServicio().getFormaPago());
                bk.getFacturaFormulario().setTipoPago(bk.getFacturaFormulario().getIdOrdenCompraServicio().getTipoPago());
                bk.getFacturaFormulario().setDiasPago(bk.getFacturaFormulario().getIdOrdenCompraServicio().getDiasPago());
                bk.getFacturaFormulario().setComentarioPago(bk.getFacturaFormulario().getIdOrdenCompraServicio().getDetallePago());
                System.out.println(bk.getFacturaFormulario().getFormaPago().getNombre() + " " + bk.getFacturaFormulario().getTipoPago() + " " + bk.getFacturaFormulario().getDiasPago());

                guia.setEstadoGuia("" + GuiaRemision.ESTADO_GUIA_REMISION.EMITIDO.getValor());
                guia.setIdOrdenCompraServicio(bk.getFacturaFormulario().getIdOrdenCompraServicio());

                bk.setListaTipoPago(new ArrayList<String>());
                for (ParametroDetalle param : servicioParametro.listarTipoPago(bk.getFacturaFormulario().getFormaPago().getNombre())) {
                    bk.getListaTipoPago().add(param.getValCadena());
                }

                System.out.println("lista de guias: " + servicioGR.obtenerGuiaRemisionPorOrdenCS(guia));
                bk.setListaGuiaRemisionElegir(servicioGR.obtenerGuiaRemisionPorOrdenCS(guia));
                System.out.println("lista de guias1: " + bk.getListaGuiaRemisionElegir());
            }


        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al guardar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }


    }

    public void llenarDetalle() {
        //List<String> guias = bk.getDualNumGuiaRemision().getTarget();
        bk.setListaGuiaRemisionElegido(new ArrayList<GuiaRemision>());
        bk.setListaDetalleFactura(new ArrayList<DetalleCompraFacturacion>());
        try {

            for (String numGuia : bk.getListaGuiaSeleccionadas()) {
                bk.getListaGuiaRemisionElegido().add(servicioGR.conseguirGuiaDeRemisionPorId(Integer.parseInt(numGuia)));
            }

            //bk.getFacturaFormulario().setIdOrdenCompraServicio(servicioOrdenCS.conseguirOrdenCompraServicioPorId(bk.getFacturaFormulario().getIdOrdenCompraServicio().getId()));

            if (bk.getFacturaFormulario().getTipoCambio() != null) {
                //System.out.println("entroooooo1 "+bk.getFacturaFormulario().getIdOrdenCompraServicio().getDetalleOrdenCompraServicioCollection());
                for (DetalleOrdenCompraServicio detalleOCS : servicioDetalleOCS.listarDetallesPorOrden(bk.getFacturaFormulario().getIdOrdenCompraServicio())) {
                    DetalleCompraFacturacion detalleCF = new DetalleCompraFacturacion();
                    System.out.println("entroooooo2 " + detalleOCS.getIdArticulo().getNombreComercial());
                    boolean encontro = false;
                    detalleCF.setCantidad(BigDecimal.ZERO);

                    detalleCF.setIdFactura(bk.getFacturaFormulario());
                    detalleCF.setIdArticulo(detalleOCS.getIdArticulo());
                    detalleCF.setDescripcion(detalleOCS.getIdArticulo().getNombreComercial());

                    for (GuiaRemision guia : bk.getListaGuiaRemisionElegido()) {
                        for (DetalleGuiaRemision detalleGR : guia.getDetalleGuiaRemisions()) {
                            System.out.println("entroooooo3 " + detalleGR.getArticulo().getNombreComercial());
                            if (detalleGR.getArticulo() == detalleCF.getIdArticulo() && detalleGR.getEstadoRegistro().equals("" + ESTADO_REGISTRO.ACTIVO.getValor())) {
                                detalleCF.setCantidad(detalleCF.getCantidad().add(detalleGR.getCantidad()));
                                encontro = true;
                            }
                        }
                    }
                    System.out.println("entroooooo4 ");
                    if (encontro) {
                        System.out.println("moneda de factura: " + bk.getFacturaFormulario().getIdTipoMoneda());
                        System.out.println("moneda de orden: " + bk.getFacturaFormulario().getIdOrdenCompraServicio().getIdTipoMoneda());
                        detalleCF.setPrecioUnitario(detalleOCS.getPrecio());
                        detalleCF.setFecCreacion(new Date());
                        detalleCF.setEstadoRegistro(ESTADO_REGISTRO.ACTIVO.getValor());
                        detalleCF.setUsrCreacion(session.getUsuario().getUsuario());
                        detalleCF.setUnidadMedida(detalleOCS.getIdTipoUnidadMinima());
                        detalleCF.setPrecioTotal(detalleCF.getCantidad().multiply(detalleCF.getPrecioUnitario()));

                        bk.getListaDetalleFactura().add(detalleCF);
                    }
                }
            } else {
                mostrarError("Elegir Fecha de Emisión");
            }
            System.out.println("lista: "+bk.getListaDetalleFactura());
            if (!bk.getListaDetalleFactura().isEmpty()) {
                calcularTotales();
            }
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al guardar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }

    }

    public void calcularTotales() {
        BigDecimal subTotal = BigDecimal.ZERO;
        BigDecimal IGVTotal = BigDecimal.ZERO;

        for (DetalleCompraFacturacion detalle : bk.getListaDetalleFactura()) {
            subTotal = subTotal.add(detalle.getPrecioTotal());
        }
        //IGVTotal = subTotal.multiply(igv);
        bk.getFacturaFormulario().setSubTotal(subTotal);
        bk.getFacturaFormulario().setIgv(subTotal.multiply(IGVTotal));
        bk.getFacturaFormulario().setTotal(IGVTotal.add(subTotal));
        System.out.println("cfr: " + bk.getFacturaFormulario().getValorCFR());
        System.out.println("cif: " + bk.getFacturaFormulario().getValorCIF());

        bk.getFacturaFormulario().setTotalImportacion(
                bk.getFacturaFormulario().getTotal().add(bk.getFacturaFormulario().getValorCFR()).add(bk.getFacturaFormulario().getValorCIF()));
        System.out.println("total importacion: " + bk.getFacturaFormulario().getTotalImportacion());

    }

    @Override
    public String aceptar() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public String retroceder() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public String cancelar() {
        return URLPaginacion.Factura.URL_LISTA_COMPRA_FACTURACION;
    }

    @Override
    public void actualizarObservador(Object object) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    public void cambiarGuia() {
        bk.getListaDetalleFactura().clear();
    }

    public void elegirFormaPago() {
        try {
            if (bk.getFacturaFormulario().getFormaPago().getNombre() != null) {
                bk.setListaTipoPago(new ArrayList<String>());
                for (ParametroDetalle param : servicioParametro.listarTipoPago(bk.getFacturaFormulario().getFormaPago().getNombre())) {
                    bk.getListaTipoPago().add(param.getValCadena());
                }
                bk.getFacturaFormulario().setDiasPago(null);
            }
        } catch (ServiceException e) {
            logger.error(e.getMessage(), e);
            mostrarError("Ocurrio un error al cargar la informacion.");
        }

    }

    public void marcarFecha(DateSelectEvent event) {

        TipoCambio tipo = new TipoCambio();
        tipo.setFecCreacion(event.getDate());
        try {
            tipo = servicioTipoCambio.ValidarTipoCambio(tipo);

            if (tipo == null) {

                bk.getFacturaFormulario().setFecEmision(null);
                bk.getFacturaFormulario().setTipoCambio(null);
                mostrarError("No se ha registrado tipo de cambio para el " + UtilitarioFecha.formatearFecha(event.getDate(), "d/M/Y"));
            } else {
                bk.getFacturaFormulario().setTipoCambio(tipo.getVenta());
            }
        } catch (ServiceException e) {
            logger.error(e.getMessage(), e);
            mostrarError("Ocurrio un error al cargar la informacion.");
        }
    }
}
